package org.nw.utils;

import nc.vo.pub.VOStatus;

import org.apache.commons.lang.StringUtils;
import org.nw.dao.NWDao;
import org.nw.service.sys.BillnoService;
import org.nw.service.sys.impl.BillnoServiceImpl;
import org.nw.vo.sys.BillnoRuleVO;
import org.nw.vo.sys.BillnoVO;
import org.nw.web.utils.WebUtils;

import com.uft.webnc.util.DateUtils;

/**
 * 单据号工具类，生成单据号
 * 
 * @author xuqc
 * @date 2012-7-7 下午11:55:33
 */
public class BillnoHelper {
	public static final int serial_no_count = 4;

	/**
	 * 在没有定义单据号生成规则的情况下，根据单据类型和默认的规则生成单据号
	 * 
	 * @param bill_type
	 * @return
	 */
	public static String generateBillnoByDefault(String bill_type) {
		if(StringUtils.isBlank(bill_type)) {
			return null;
		}
		StringBuffer billno = new StringBuffer();
		billno.append(bill_type);
		billno.append(DateUtils.getYear());
		billno.append(DateUtils.getMonth());
		billno.append(DateUtils.getDay());
		// 流水号位数
		billno.append(getSerialno(bill_type, serial_no_count));
		return billno.toString();
	}

	/**
	 * 根据单据类型返回单据号
	 * 
	 * @param bill_type
	 * @return
	 */
	public static String generateBillno(String bill_type) {
		if(StringUtils.isBlank(bill_type)) {
			return null;
		}
		BillnoService billnoService = new BillnoServiceImpl();
		BillnoRuleVO ruleVO = billnoService.getByBillType(bill_type);
		if(ruleVO == null) {
			throw new RuntimeException("没有定义单据号生成规则，单据类型：" + bill_type);
		}
		StringBuffer billno = new StringBuffer();
		if(ruleVO.getIs_bill_type().booleanValue()) {
			billno.append(bill_type);
		}
		if(ruleVO.getIs_pk_corp().booleanValue()) {
			billno.append(WebUtils.getLoginInfo().getCorp_code()); // 这里使用的是公司编码
		}
		if(ruleVO.getIs_pk_dept().booleanValue()) {
			billno.append(WebUtils.getLoginInfo().getDept_Code());// 这里使用的是部门编码
		}
		if(ruleVO.getIs_year().booleanValue()) {
			billno.append(DateUtils.getYear());
		}
		if(ruleVO.getIs_month().booleanValue()) {
			billno.append(DateUtils.getMonth());
		}
		if(ruleVO.getIs_day().booleanValue()) {
			billno.append(DateUtils.getDay());
		}
		if(ruleVO.getIs_serial_no().booleanValue()) {
			// 流水号位数
			billno.append(getSerialno(bill_type, ruleVO.getSerial_no_count()));
		}
		return billno.toString();
	}

	/**
	 * 返回可用的流水号，如果当前的单据类型已经存在流水号，则返回流水号+1，否则返回1， 返回的数值需要根据位数进行补齐，如0001
	 * 
	 * @param bill_type
	 * @param serial_no_count
	 *            //流水号的位数
	 * @return
	 */
	private static String getSerialno(String bill_type, int serial_no_count) {
		NWDao dao = NWDao.getInstance();
		String where = "isnull(dr,0)=0 and bill_type=? and pk_corp=?";
		BillnoVO billnoVO = dao
				.queryByCondition(BillnoVO.class, where, bill_type, WebUtils.getLoginInfo().getPk_corp());
		int serialno; // 流水号
		if(billnoVO == null) {
			// 此时还没有流水号，
			serialno = 1;
			billnoVO = new BillnoVO();
			billnoVO.setBill_type(bill_type);
			billnoVO.setSerial_no(serialno);
			billnoVO.setPk_corp(WebUtils.getLoginInfo().getPk_corp());
			billnoVO.setStatus(VOStatus.NEW);
			NWDao.setUuidPrimaryKey(billnoVO);
		} else {
			String currentDate = DateUtils.getCurrentDate();
			String date = billnoVO.getTs().getDate().toString();
			if(currentDate.equals(date)) {
				// 同一天的序列号
				serialno = billnoVO.getSerial_no() + 1;
			} else {
				// 不同天，序列号还是从1开始
				serialno = 1;
			}
			billnoVO.setSerial_no(serialno);
			billnoVO.setStatus(VOStatus.UPDATED);
		}
		dao.saveOrUpdate(billnoVO);
		StringBuffer sb = new StringBuffer(serialno + "");
		int length = sb.length();
		// 如果位数不够，补0
		for(int i = 0; i < (serial_no_count - length); i++) {
			sb.insert(0, "0");
		}
		return sb.toString();
	}
}
